You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
5.3 KiB
136 lines
5.3 KiB
<script lang="ts" context="module">
|
|
import type { Load } from "@sveltejs/kit/types/internal";
|
|
|
|
function generateItemFilters(now: Date): {scheduledFilter: ItemFilter, acquiredFilter: ItemFilter, looseFilter: ItemFilter} {
|
|
return {
|
|
scheduledFilter: {
|
|
scheduledDate: datesOf(parseInterval("next:7d", now)),
|
|
},
|
|
acquiredFilter: {
|
|
acquiredTime: morningInterval(parseInterval("today", now)),
|
|
},
|
|
looseFilter: {
|
|
loose: true,
|
|
unAcquired: true,
|
|
unScheduled: true,
|
|
},
|
|
}
|
|
}
|
|
|
|
export const load: Load = async({params, stuff, fetch}) => {
|
|
const scopeId = parseInt(params.scope.split("-")[0]);
|
|
|
|
const client = sl3(fetch, stuff.idToken);
|
|
|
|
const {acquiredFilter, looseFilter, scheduledFilter} = generateItemFilters(new Date());
|
|
const [scheduledItems, acquiredItems, looseItems, sprints] = await Promise.all([
|
|
client.listItems(scopeId, scheduledFilter),
|
|
client.listItems(scopeId, acquiredFilter),
|
|
client.listItems(scopeId, looseFilter),
|
|
client.listSprints(scopeId),
|
|
]);
|
|
|
|
return {
|
|
stuff: { title: "Overview" },
|
|
props: {scheduledItems, acquiredItems, looseItems, sprints}
|
|
};
|
|
}
|
|
</script>
|
|
|
|
<script lang="ts">
|
|
import { sl3 } from "$lib/clients/sl3";
|
|
import { getScopeContext } from "$lib/components/contexts/ScopeContext.svelte";
|
|
import Column from "$lib/components/layout/Column.svelte";
|
|
import Columns from "$lib/components/layout/Columns.svelte";
|
|
import Row from "$lib/components/layout/Row.svelte";
|
|
import Option from "$lib/components/layout/Option.svelte";
|
|
import OptionsRow from "$lib/components/layout/OptionsRow.svelte";
|
|
import StatSubSection from "$lib/components/scope/StatSubSection.svelte";
|
|
import DeletionModal from "$lib/modals/DeletionModal.svelte";
|
|
import StatCreateEditModal from "$lib/modals/StatCreateEditModal.svelte";
|
|
import parseInterval, { datesOf, morningInterval } from "$lib/utils/timeinterval";
|
|
import type Item from "$lib/models/item";
|
|
import ItemCreateModal from "$lib/modals/ItemCreateModal.svelte";
|
|
import Card from "$lib/components/common/Card.svelte";
|
|
import CardHeader from "$lib/components/common/CardHeader.svelte";
|
|
import SprintCreateUpdateModal from "$lib/modals/SprintCreateUpdateModal.svelte";
|
|
import type Sprint from "$lib/models/sprint";
|
|
import SprintListContext from "$lib/components/contexts/SprintListContext.svelte";
|
|
import SprintList from "$lib/components/scope/SprintList.svelte";
|
|
import ItemAcquireModal from "$lib/modals/ItemAcquireModal.svelte";
|
|
import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
|
|
import ProjectCreateEditModal from "$lib/modals/ProjectCreateEditModal.svelte";
|
|
import ScopeCreateUpdateModal from "$lib/modals/ScopeCreateUpdateModal.svelte";
|
|
import type { ItemFilter } from "$lib/models/item";
|
|
import ItemMultiListContext from "$lib/components/contexts/ItemMultiListContext.svelte";
|
|
import { getTimeContext } from "$lib/components/contexts/TimeContext.svelte";
|
|
import ItemListRow from "$lib/components/scope/ItemListRow.svelte";
|
|
import Icon from "$lib/components/layout/Icon.svelte";
|
|
|
|
export let acquiredItems: Item[];
|
|
export let scheduledItems: Item[];
|
|
export let looseItems: Item[];
|
|
export let sprints: Sprint[];
|
|
|
|
const {scope} = getScopeContext();
|
|
const {openModal} = getModalContext();
|
|
const {now} = getTimeContext();
|
|
|
|
function openCreateProject() {
|
|
openModal({name: "project.create"});
|
|
}
|
|
|
|
function openPostItem() {
|
|
openModal({name: "item.create"});
|
|
}
|
|
|
|
function openEditScope() {
|
|
openModal({name: "scope.edit", scope: $scope});
|
|
}
|
|
|
|
function openDeleteScope() {
|
|
openModal({name: "scope.delete", scope: $scope});
|
|
}
|
|
</script>
|
|
|
|
<ItemMultiListContext lists={{acquiredItems, scheduledItems, looseItems}} filters={generateItemFilters($now)}>
|
|
<SprintListContext sprints={sprints} intervalString="">
|
|
<Columns fullwidth>
|
|
<Column>
|
|
<Row title="Options">
|
|
<Card on:click={openCreateProject} pointerCursor><CardHeader>Create Project</CardHeader></Card>
|
|
<Card on:click={openPostItem} pointerCursor><CardHeader>Create Item</CardHeader></Card>
|
|
<Card on:click={openEditScope} pointerCursor><CardHeader>Edit Scope</CardHeader></Card>
|
|
<Card on:click={openDeleteScope} pointerCursor><CardHeader>Delete Scope</CardHeader></Card>
|
|
</Row>
|
|
<ItemListRow title="Scheduled" key="scheduleItems" />
|
|
<ItemListRow title="Today" key="acquiredItems" showAcquiredTime />
|
|
<ItemListRow title="Loose" key="looseItems" />
|
|
</Column>
|
|
<Column>
|
|
<Row title="Sprints">
|
|
<OptionsRow slot="right">
|
|
<Option open={{name: "sprint.create"}}><Icon name="plus" /></Option>
|
|
</OptionsRow>
|
|
<SprintList sub />
|
|
</Row>
|
|
<Row title="Stats">
|
|
<OptionsRow slot="right">
|
|
<Option open={{name: "stat.create"}}><Icon name="plus" /></Option>
|
|
</OptionsRow>
|
|
{#each $scope.stats as stat (stat.id)}
|
|
<StatSubSection stat={stat} />
|
|
{/each}
|
|
</Row>
|
|
</Column>
|
|
</Columns>
|
|
|
|
<ItemCreateModal />
|
|
<ItemAcquireModal />
|
|
<StatCreateEditModal />
|
|
<DeletionModal />
|
|
<SprintCreateUpdateModal />
|
|
<ProjectCreateEditModal />
|
|
<ScopeCreateUpdateModal />
|
|
</SprintListContext>
|
|
</ItemMultiListContext>
|